// app.ts
import { login } from './services/user';

// 扩展全局数据类型
interface AppUserInfo {
  id: string | number;
  nickname: string;
  avatar: string;
  phone: string;
  [key: string]: any;
}

interface IAppOption {
  globalData: {
    userInfo: AppUserInfo | null;
    token: string;
    isLogin: boolean;
    cart: any[];
    safeAreaTop?: number;
  };
  login: (phoneCode: string) => Promise<any>;
  wxLogin: () => Promise<WechatMiniprogram.LoginSuccessCallbackResult>;
  checkLogin: () => boolean;
  showLoginModal: () => void;
  setLoginModalComponent: (component: any) => void;
  checkLoginStatus: () => void;
  preloadLoginModal: () => void;
  calculateSafeAreaTop: () => void;
  setSafeAreaTopCSS: (safeAreaTop: number) => void;
  clearCartAndTableCache: () => void;
  loginModalComponent?: any;
}

App<IAppOption>({
  globalData: {
    userInfo: null,
    token: '',
    isLogin: false,
    cart: []
  },
  onLaunch() {
    // 展示本地存储能力
    // const logs = wx.getStorageSync('logs') || [];
    // logs.unshift(Date.now());
    // wx.setStorageSync('logs', logs);

    // 计算安全区域高度
    this.calculateSafeAreaTop();

    // 检查登录状态
    this.checkLoginStatus();
    
    // 预加载全局登录弹窗页面
    this.preloadLoginModal();
  },

  onHide() {
    // 小程序退出时清除购物车和桌号缓存
    this.clearCartAndTableCache();
  },

  /**
   * 动态计算安全区域顶部高度
   */
  calculateSafeAreaTop() {
    try {
      // 获取系统信息
      const systemInfo = wx.getSystemInfoSync();
      const { platform, statusBarHeight } = systemInfo;
      
      // 获取胶囊按钮信息
      const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
      
      let safeAreaTop = statusBarHeight;
      
      if (platform === 'ios') {
        // iOS 设备：胶囊按钮顶部到状态栏底部的距离
        safeAreaTop = menuButtonInfo.top;
      } else if (platform === 'android') {
        // Android 设备：胶囊按钮顶部到状态栏底部的距离
        safeAreaTop = menuButtonInfo.top;
      }
      
      // 设置全局 CSS 变量
      wx.setStorageSync('safeAreaTop', safeAreaTop);
      
      // 动态设置 CSS 变量到页面
      this.setSafeAreaTopCSS(safeAreaTop);
      
      console.log('安全区域顶部高度计算完成:', {
        platform,
        statusBarHeight,
        menuButtonTop: menuButtonInfo.top,
        safeAreaTop
      });
      
    } catch (error) {
      console.error('计算安全区域高度失败:', error);
      // 使用默认值
      const defaultSafeAreaTop = 44;
      wx.setStorageSync('safeAreaTop', defaultSafeAreaTop);
      this.setSafeAreaTopCSS(defaultSafeAreaTop);
    }
  },

  /**
   * 设置安全区域顶部高度的 CSS 变量
   */
  setSafeAreaTopCSS(safeAreaTop: number) {
    try {
      // 使用 wx.createSelectorQuery 获取页面元素并设置 CSS 变量
      const query = wx.createSelectorQuery();
      query.select('page').boundingClientRect((rect) => {
        if (rect) {
          // 通过 wx.setNavigationBarColor 或其他方式设置全局样式
          // 由于微信小程序的限制，我们通过存储到全局数据中供页面使用
          this.globalData.safeAreaTop = safeAreaTop;
          
          // 触发自定义事件，让页面知道安全区域高度已更新
          const app = getApp<IAppOption>();
          if (app) {
            app.globalData.safeAreaTop = safeAreaTop;
          }
        }
      }).exec();
    } catch (error) {
      console.error('设置 CSS 变量失败:', error);
    }
  },

  /**
   * 清除购物车和桌号缓存
   */
  clearCartAndTableCache() {
    try {
      // 清除购物车数据
      wx.removeStorageSync('cart');
      this.globalData.cart = [];
      
      // 清除桌号数据
      wx.removeStorageSync('tableId');
      wx.removeStorageSync('tableNo');
      
      console.log('已清除购物车和桌号缓存');
    } catch (error) {
      console.error('清除缓存失败:', error);
    }
  },

  /**
   * 检查登录状态
   */
  checkLoginStatus() {
    const token = wx.getStorageSync('token');
    
    if (token) {
      this.globalData.token = token;
      this.globalData.isLogin = true;
      console.log('用户已登录，token存在');
    } else {
      console.log('用户未登录');
    }
  },

  /**
   * 登录方法 - 通过手机号code登录
   */
  async login(phoneCode: string) {
    try {
      // 获取微信登录code
      const loginResult = await this.wxLogin();
      
      // 调用登录接口
      const loginData = {
        type: 'mini_app',
        code: loginResult.code,
        phoneCode: phoneCode
      };
      console.log('loginData', loginData)
      const res = await login(loginData);
      console.log('login', res)
      if (res.code === 200 && res.data) {
        console.log('res.data', res.data)
        // 只保存token，用户信息通过API获取
        this.globalData.token = res.data.token;
        this.globalData.isLogin = true;
        wx.setStorageSync('token', res.data.token);
        wx.setStorageSync('refreshToken', res.data.refreshToken);
        
        wx.showToast({
          title: '登录成功',
          icon: 'success'
        });
        
        return res.data;
      } else {
        wx.showToast({
          title: res.message || '登录失败',
          icon: 'none'
        });
        throw new Error(res.message || '登录失败');
      }
    } catch (error) {
      console.error('登录失败', error);
      wx.showToast({
        title: '登录失败',
        icon: 'none'
      });
      throw error;
    }
  },

  /**
   * 获取微信登录code
   */
  wxLogin(): Promise<WechatMiniprogram.LoginSuccessCallbackResult> {
    return new Promise((resolve, reject) => {
      wx.login({
        success: resolve,
        fail: reject
      });
    });
  },

  /**
   * 检查是否需要登录
   */
  checkLogin(): boolean {
    if (!this.globalData.isLogin) {
      this.showLoginModal();
      return false;
    }
    return true;
  },

  /**
   * 显示登录弹窗
   */
  showLoginModal() {
    if (this.loginModalComponent) {
      this.loginModalComponent.showLoginModal();
    } else {
      // 如果没有登录弹窗组件，显示默认提示
      wx.showModal({
        title: '登录提示',
        content: '请先登录后再使用此功能',
        showCancel: false
      });
    }
  },

  /**
   * 设置登录弹窗组件引用
   */
  setLoginModalComponent(component: any) {
    this.loginModalComponent = component;
  },

  /**
   * 预加载登录弹窗页面
   */
  preloadLoginModal() {
    // 预加载全局登录弹窗页面，确保组件可用
    // wx.navigateTo({
    //   url: '/pages/global-login/global-login',
    //   success: () => {
    //     // 立即返回，这样页面就被预加载了
    //     setTimeout(() => {
    //       wx.navigateBack();
    //     }, 100);
    //   }
    // });
  }
});